package br.com.sgs.basic;
import br.com.sgs.persist.Area;
import br.com.sgs.persist.Cargo;
import br.com.sgs.persist.Sequsuariofornecedor;
import java.io.Serializable;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;
import org.hibernate.Query;
import org.hibernate.Session;
import br.com.sgs.persist.Contrato;
import br.com.sgs.persist.Epi;
import br.com.sgs.persist.Fornecedor;
import br.com.sgs.persist.Funcionario;
import br.com.sgs.persist.Marca;
import br.com.sgs.persist.Obra;
import br.com.sgs.persist.Pessoa;
import br.com.sgs.persist.PessoaJuridica;
import br.com.sgs.persist.Seqfornecedor;
import br.com.sgs.persist.Seqfuncionario;
import br.com.sgs.persist.Sequsuario;
import br.com.sgs.persist.Suprimento;
import br.com.sgs.persist.Uf;
import br.com.sgs.persist.Unidade;
import br.com.sgs.persist.Usuario;
import br.com.sgs.persist.UsuarioFornecedor;


/**
 * @author MaUrO FiLhO
 */

public class GenericDAO implements Serializable {

    
    public static final String FALHA = "falha";
    public static final String SUCESSO = "sucesso";

    //BASIC DAO
    public String inserir(Object object){
         String retorno = FALHA;
       try{
          BeginTrans b = BeginTrans.beginSessionTransaction();
          b.getSessao().save(object);
          BeginTrans.endSessionTransaction(b);
          retorno = SUCESSO;
       } catch (Exception e) {
          System.err.println ("Erro na Inserção: "+e);
          retorno = FALHA;
       }
         return retorno;
    }

    public String deletar(Object object){
        String retorno = FALHA;
       try{
          BeginTrans b = BeginTrans.beginSessionTransaction();
          b.getSessao().delete(object);
          BeginTrans.endSessionTransaction(b);
          retorno = SUCESSO;
       } catch (Exception e) {
          System.err.println ("Erro de Exclusão: "+e);
          retorno = FALHA;

       }
         return retorno;
    }
    public String alterar(Object object){
        String retorno = FALHA;
       try{
          BeginTrans b = BeginTrans.beginSessionTransaction();
          b.getSessao().merge(object);
          BeginTrans.endSessionTransaction(b);
          retorno = SUCESSO;
       } catch (Exception e) {
          System.err.println ("Erro na Alteração: "+e);
          retorno = FALHA;
       }
         return retorno;
    }

    public String alterarObj(Object object){
        String retorno = FALHA;
       try{
          BeginTrans b = BeginTrans.beginSessionTransaction();
          b.getSessao().saveOrUpdate(object);
          BeginTrans.endSessionTransaction(b);
          retorno = SUCESSO;
       } catch (Exception e) {
          System.err.println ("Erro na Alteração: "+e);
          retorno = FALHA;
       }
         return retorno;
    }
    //DELETE POR ID
    public void deleteForIdPessoa(int Id){

        BeginTrans b = BeginTrans.beginSessionTransaction();
        
        Query q = b.getSessao().createQuery("delete from Pessoa where id= :id");
        q.setInteger("id", Id);
        q.executeUpdate();

        BeginTrans.endSessionTransaction(b);
    }

    //CONSULTA QUE RETORNA LISTA PARA INSERIR--------------------------------

    public List consultarSequenciaUsuarioInsert(){

        BeginTrans b = BeginTrans.beginSessionTransaction();

        Sequsuario s=new Sequsuario();
        b.getSessao().save(s);

        List listResultado = b.getSessao().createQuery("from Sequsuario").list();

        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
     public List consultarSequenciaFuncionarioInsert(){


        BeginTrans b = BeginTrans.beginSessionTransaction();

        Seqfuncionario s=new Seqfuncionario();
        b.getSessao().save(s);

        List listResultado = b.getSessao().createQuery("from Seqfuncionario").list();

        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

    public List consultarSequenciaFornecedorInsert(){

        BeginTrans b = BeginTrans.beginSessionTransaction();

        Seqfornecedor s=new Seqfornecedor();
        b.getSessao().save(s);

        List listResultado = b.getSessao().createQuery("from Seqfornecedor").list();

        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

    public List<Sequsuariofornecedor> consultarSequenciaUsuarioFornecedorInsert() {
        BeginTrans b = BeginTrans.beginSessionTransaction();

        Sequsuariofornecedor s=new Sequsuariofornecedor();
        b.getSessao().save(s);

        List listResultado = b.getSessao().createQuery("from Sequsuariofornecedor").list();

        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

    //CONSULTA QUE RETORNA LISTA COMPLETA
    //Suprimento
     public List<Suprimento> getAllSuprimento(){

        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Suprimento order by id_suprimento");
        List<Suprimento> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

      public List<Suprimento> getAllSuprimentoBeEpi(){

        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Suprimento where tipo= 'EPI' order by id_suprimento");
        List<Suprimento> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

      public List<Suprimento> getAllSuprimentoBeEpiLikeDiscriminacao(Suprimento sup){

        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Suprimento where tipo= 'EPI' and discriminacao= :disc  order by id_suprimento");
         t.setString("disc", sup.getDiscriminacao());
        List<Suprimento> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

      public List<Contrato> getAllContrato(){

        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Contrato order by id_contrato");
        List<Contrato> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

      public List<Area> getAllArea(){

        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Area order by id_area");
        List<Area> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
       public List<Funcionario> getAllFuncionario(){

        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Funcionario");
        List<Funcionario> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

     public List<Marca> getAllMarca(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Marca");
        List<Marca> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
     public List<Usuario> getAllUsuario(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Usuario");
        List<Usuario> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
     public List<UsuarioFornecedor> getAllUsuarioFornecedor(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from UsuarioFornecedor");
        List<UsuarioFornecedor> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

     public List<Cargo> getAllCargo(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Cargo");
        List<Cargo> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

     public List<Obra> getAllObra(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Obra");
        List<Obra> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
     public List<Fornecedor> getAllFornecedor(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Fornecedor");
        List<Fornecedor> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
     public List<Epi> getAllEpi(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Epi");
        List<Epi> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
    //CONSULTA QUE RETORNA LISTA POR ID

     public List<Suprimento> getSuprimentoById(Integer id) {
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Suprimento where id_suprimento= :id");
        t.setInteger("id", id);
        List<Suprimento> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);
        return listResultado;
    }
     public List<Suprimento> consultarSuprimentoByNome(String nome) {
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Suprimento where nome= :nome");
        t.setString("nome", nome);
        List<Suprimento> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);
        return listResultado;
    }
     
    //CONSULTA QUE RETORNA LISTA
     //Usuario
    public List<Usuario> consultarUsuarioByNome(String nome) {
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Usuario where usuario= :usuario");
        t.setString("usuario", nome);
        List<Usuario> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);
        return listResultado;
    }


    public List<Usuario> consultarUsuarioBySenha(String senha){

        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Usuario where senha= :senha");
        t.setString("senha",senha);
        List<Usuario> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
    //Pessoa
     public List<Pessoa> consultarPessoabyId(int id){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Pessoa where id_pessoa= :id");
        t.setInteger("id", id);
        List<Pessoa> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
     
    public List<Pessoa> consultarPessoaByCpf(String cpf){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Pessoa where cpf= :cpf");
        t.setString("cpf", cpf);
        List<Pessoa> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
    public List<Pessoa> consultarPessoaByNome(String nome){

        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Pessoa where nome= :nome");
        t.setString("nome",nome);
        List<Pessoa> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

    public List<PessoaJuridica> consultarPessoaJuridicaByNome(String nomeFantasia) {
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from PessoaJuridica where nome_fantasia = :nome");
        t.setString("nome",nomeFantasia);
        List<PessoaJuridica> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);
        return listResultado;
    }

    //Usuario&Pesssoa
     public List<Pessoa> consultarPessoaAndUsuariobyCpf(String cpf){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Pessoa where cpf= :cpf");
        t.setString("cpf", cpf);
        List<Pessoa> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
    
    //Obra
    public List<Obra> consultarObraByNome(String nome){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Obra where nome= :nome");
        t.setString("nome", nome);
        List<Obra> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

    public List<Obra> consultarObraByUsuario(String nome){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Obra o where o.idObra in "
                + "(select f.obra from Funcionario as f,Usuario as u where"
                + " f.pessoa=u.pessoa and u.usuario= :user)");
        t.setString("user", nome);
        List<Obra> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
     public List<Cargo> consultarCargoByNome(String descricao){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Cargo where descricao= :descricao");
        t.setString("descricao", descricao);
        List<Cargo> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

    public List<Obra> consultarObraById(int idObra) {
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Obra where idObra= :id");
        t.setInteger("id", idObra);
        List<Obra> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }
    //Contrato
    public List<Contrato> consultarContratoByObjeto(String objeto){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Contrato where objeto= :objeto");
        t.setString("objeto",objeto );
        List<Contrato> listResultado = t.list();
        BeginTrans.endSessionTransaction(b);

        return listResultado;
    }

       public Connection getConexao(){

        BeginTrans b = BeginTrans.beginSessionTransaction();
        Connection con =b.getSessao().connection();
        return con;
       }

       // SELECT ITEM
       public List<SelectItem> getMarcas(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Marca");
        List<Marca> listResultado = t.list();

        List<SelectItem> itens = new ArrayList<SelectItem>(listResultado.size());
        
        for(Marca s : listResultado){
			itens.add(new SelectItem(s.getMarca(), s.getMarca()));
		}
        
        BeginTrans.endSessionTransaction(b);

        return itens;
        }
        public List<SelectItem> getUnidades(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Unidade");
        List<Unidade> listResultado = t.list();

        List<SelectItem> itens = new ArrayList<SelectItem>(listResultado.size());

        for(Unidade s : listResultado){
			itens.add(new SelectItem(s.getUnidade(), s.getUnidade()));
		}

        BeginTrans.endSessionTransaction(b);

        return itens;
        }
        public List<SelectItem> getObras(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Obra");
        List<Obra> listResultado = t.list();

        List<SelectItem> itens = new ArrayList<SelectItem>(listResultado.size());

        for(Obra o : listResultado){
			itens.add(new SelectItem(o,o.getNome()));
		}

        BeginTrans.endSessionTransaction(b);

        return itens;
        }

        public List<SelectItem> getCargos(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Cargo");
        List<Cargo> listResultado = t.list();

        List<SelectItem> itens = new ArrayList<SelectItem>(listResultado.size());

        for(Cargo c : listResultado){
			itens.add(new SelectItem(c, c.getDescricao()));
		}

        BeginTrans.endSessionTransaction(b);

        return itens;
        }

        public List<SelectItem> getFuncionarios(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Funcionario as f where f.pessoa not in( select u.pessoa from Usuario as u)");
        List<Funcionario> listResultado = t.list();

        List<SelectItem> itens = new ArrayList<SelectItem>(listResultado.size());

        for(Funcionario f : listResultado){
			itens.add(new SelectItem(f.getPessoa().getNome(),f.getPessoa().getNome()));
		}

        BeginTrans.endSessionTransaction(b);

        return itens;
        }

        public List<SelectItem> getFornecedores(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Fornecedor as f where f.pessoaJuridica not in( select u.pessoaJuridica from UsuarioFornecedor as u)");
        List<Fornecedor> listResultado = t.list();

        List<SelectItem> itens = new ArrayList<SelectItem>(listResultado.size());

        for(Fornecedor f : listResultado){
			itens.add(new SelectItem(f.getPessoaJuridica().getNomeFantasia(),f.getPessoaJuridica().getNomeFantasia()));
		}

        BeginTrans.endSessionTransaction(b);

        return itens;
        }
        
        public List<SelectItem> getContratos(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Contrato");
        List<Contrato> listResultado = t.list();

        List<SelectItem> itens = new ArrayList<SelectItem>(listResultado.size());

        for(Contrato c : listResultado){
			itens.add(new SelectItem(c,c.getObjeto()));
		}

        BeginTrans.endSessionTransaction(b);

        return itens;
        }

        public List<SelectItem> getUfs(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Uf");
        List<Uf> listResultado = t.list();

        List<SelectItem> itens = new ArrayList<SelectItem>(listResultado.size());

        for(Uf u : listResultado){
			itens.add(new SelectItem(u,u.getNome()));
		}

        BeginTrans.endSessionTransaction(b);

        return itens;
        }
         
        public List<SelectItem> getFuncionarios100User(){
        BeginTrans b = BeginTrans.beginSessionTransaction();
        Query t = b.getSessao().createQuery("from Funcionario as f"
                                          + " where f.pessoa not in("
                                          + " select u.pessoa from Usuario as u)");
        List<Funcionario> listResultado = t.list();

        List<SelectItem> itens = new ArrayList<SelectItem>(listResultado.size());

        for(Funcionario f : listResultado){
			itens.add(new SelectItem(f.getPessoa().getNome(),f.getPessoa().getNome()));
		}

        BeginTrans.endSessionTransaction(b);

        return itens;
        }

}
